4.1 数值类型及运算符¶
让我们开始Python的学习吧,在本节中,会从基本的数值类型以及运算符出发,以几行简单的代码为大家介绍Python语言学习的基础内容。 如果有C语言的基础,相信大家能轻松理解Python语言的编程格式。
4.1.1 算术运算符¶
对于四则运算中的+、-、×,在Python(无论是Python2.x还是Python3.x)中的计算规则与我们日常生活中的使用方法一致。
1 2 3 4 5 6 | >>> 1 + 2
3
>>> 1 - 2
-1
>>> 1 * 2
2
|
其中的数字“1、2”被称为操作数,“+、-、×”被称为算术运算符。
而对于除法,则有整除和普通的除法两种,并且在Python2.x和Python3.x中,除号“/”的运算结果也不完全相同。
在Python3.x中,其除法运算满足下列的规律:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 1 / 2
0.5
>>> 2 / 2
1.0
>>> 2.0 / 2.0
1.0
>>> 2.0 / 2
1.0
>>> 1 / 3
0.3333333333333333
|
从上面的除法结果中发现了什么?无论操作数的类型是整数还是浮点数,Python3.x都会返回浮点数结果。
而在Python2.x中,进行除法“/”运算时,如果两个操作数都为整数,计算结果只保留整数部分,只有当两个操作数中至少有一个浮点数时, 才会返回浮点数类型的精确结果。
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 1 / 2
0
>>> 1.0 / 2
0.5
>>> 1.0 / 2.0
0.5
>>> 1 / 2.0
0.5
>>> 1 / 3
0.3333333333333333
|
在Python2.x中可以通过导入“division” 模块来保持与Python 3.x一致的除法运算。
1 2 3 | >>> from __future__ import division
>>> 1 / 2
0.5
|
对于整除“//”,Python2.x与Python3.x一样,保留运算结果中的整数部分,如果操作数中有浮点数类型的数值,则计算结果为浮点数类型,小数部分为0。
1 2 3 4 5 6 7 8 9 10 11 12 | >>> 5 // 2
2
>>> 5.0 // 2
2.0
>>> 5 // 2.0
2.0
>>> 5.0 // 2.0
2.0
>>> 1.6 // 0.3
5.0
|
在介绍完基本的四则运算后,还有两个相当重要的计算符号——取余“%”和幂“**”。
1 2 3 4 5 6 7 8 9 | >>> 5 % 2
1
>>> 5.0 % 2
1.0
>>> 2 ** 4
16
>>> 2.0 ** 4
16.0
|
取余操作在编程项目中经常被使用,比如想得到x上各个位(个位、十位、百位等)的数值,可以通过对x进行取余、整除的方式获得; 又或者是定时操作,当前时长对定时时长取余,以判断结果是否为零作为判断条件。
4.1.2 布尔类型¶
在Python中共有两种布尔类型(bool)的值,分别为True(真)和False(假),它们的值分别等价于1和0,且能进行数值计算。 布尔类型常常充当运算符结果的返回值,如比较运算符、成员运算符等,用来判断运算结果的真假, 因此在If、For、While等语句中广泛应用了布尔类型。
1 2 3 4 5 6 7 8 9 | >>> True + 1
2
>>> True + 1.2
2.2
>>> False + 1
1
>>> False + 1.2
1.2
|
在使用True和False进行数值计算时,需注意单词的大小写,否则Python解释器无法识别该常量,将发生以下的情况:
1 2 3 4 | >>> true + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'true' is not defined
|
4.1.3 比较运算符¶
布尔类型常常被用于If、For、While等判断或循环语句中作为判断或循环中断的标志位,其中,难免伴随着数值比较的过程, 这就要用到比较运算符“<、>、==、>=、……”。
1 2 3 4 5 6 7 8 9 10 | >>> 1 > 2
False
>>> 1 < 2
True
>>> 1 == 2
False
>>> 1 >= 2
False
>>> 1 <= 2
True
|
可以看到,比较运算符的返回值为布尔类型,这在If、For、While等语句中很有用处。
4.1.4 逻辑运算符¶
介绍完了算数运算符和比较运算符后,还有一种运算符叫做逻辑运算符——and、or、not,它用来判断操作数是否为零。
1 2 3 4 5 6 7 8 9 | >>> True and False
False
>>> True or False
True
>>> not True
False
>>> not False
True
|
在使用逻辑运算符时,操作数与运算符之间需用空格隔开,否则Python解释器无法正确识别该语句。 在and判断中,两个操作数中有一个为假,则返回值为False;在or中,有一个为真,则返回真;not是将当前的值对应的布尔值取反。
逻辑运算符的操作数可以用整数或浮点数代替么?当然可以。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | >>> 1 and 2
2
>>> 2.0 and 1
1
>>> 1 and 0
0
>>> 1 or 2
1
>>> 2.0 or 1
2.0
>>> 1 or 0
1
>>> not 1
False
>>> not -1
False
>>> not 2.0
False
>>> not 0
True
|
仔细观察程序,可以发现:
- and:从左到右,若所有值均为真,则返回后一个值,有一个假的值,则返回第一个假的值;
- or:从左到右,返回遇到的第一个判断为真的值;
- not:所有的非零数值的返回值为False,而0则返回True。
显然,在逻辑运算符的判断中,Python解释器将所有的非零数值都当作是True,把0当作是False。
4.1.5 整数¶
由于在Python3.x与在Python2.x中关于整数类型的分类有所不同,在此,对整数部分内容进行单独讲解。 在Python3.x中,无论整数数值的大小,整数只有一种类型——长整数,而在Python2.x中,整数的类型被分为int(32位整数)和long int(长整数)。 长整数不受位数的限制,可以扩展到可用内存的最大值。
1 2 3 4 5 | >>> 10000000000 #Python3.x版本
10000000000
>>> 10000000000 #Python2.2以后的版本
10000000000L #长整数型数字后缀加“L”
|
我们可以发现,在Python2.x中以后缀L来区分整数和长整数,而在Python3.x中则取消了这种区分。这里需要注意的是,在Python2.2之前的版本中, 不支持整数与长整数的自动切换。
1 2 3 4 5 | >>> 10000000000 #Python2.2以前的版本不会对整数类型进行自动转换
OverFlowError:integer literal too large
>>> 10000000000L #需手动在大数后添加L
10000000000L
|
4.1.6 字符串¶
在本章的开始部分,使用了print函数来打印“Hello World!”语句。那么,对于Python解释器来说,“Hello World!”是什么类型的数据呢?字符串类型。 在Python中,我们可以使用双引号(“”)或单引号(‘’)来定义字符串。
1 2 3 4 | >>> "Hello world!"
'Hello world!'
>>> 'Hello world!'
'Hello world!'
|
其输出的结果都是一样的,那为什么需要两种定义方式呢?请看下例。
1 2 3 4 5 6 7 | >>> "I'm John"
"I'm John"
>>> 'I'm John'
File "<stdin>", line 1
'I'm John'
^
SyntaxError: invalid syntax
|
Python解释器成功将第一个语句”I’m John”打印了出来,而无法打印第二个语句’I’m John’。这是因为双引号与单引号是两两对应的关系, 在第二个语句中,Python读取到’I’后,认为已读取完成一个字符串,无法识别之后的字符,从而产生错误。
相信你已经明白了为何要用两种定义方式来定义字符串。其实,除了用双引号与单引号共同使用来区分字符串的方式外,还有一种使用反斜杠“” 来对双引号或单引号进行转义,让Python解释器理解中间的引号是字符串中的一个字符。
1 2 | >>> 'I\'m John'
"I'm John"
|
尽管反斜杠不如双引号与单引号共同使用来的直观,但在同时使用了双引号和单引号的长语句中,我们不得不使用反斜杠来进行转义。
如何避免该长语句的出现呢?Python提供字符串的拼接操作。
1 2 3 4 | >>> "Hello " + "world!"
'Hello world!'
>>> "Hello " "world!"
'Hello world!'
|
无论是使用“+”连接字符串还是连续写下两个字符串,Python都会将其自动拼接为一个字符串,甚至支持用乘法来重复打印字符串。
1 2 | >>> "Hello! " * 3
'Hello! Hello! Hello! '
|
通过之前的程序,相信大家已经知道了创建字符串的基本操作,接下来介绍一些处理字符串的常用操作。
1 2 3 4 5 6 | >>> "This is a string"[0]
'T'
>>> "This is a string"[0:1]
'T'
>>> "This is a string"[0:4]
'This'
|
在Python中,字符串可以被当作是一种字符列表,通过类似于列表的切片操作,单独打印字符串中被选择的字符。
在实际的编程过程中,很少会直接输出一个固定的语句,我们经常会希望让输出语句中的变量会随着程序进程的变化而变化。 在Python2.6以前版本中,使用%来实现该操作。
1 2 3 4 | >>> x = 'apple'
>>> y = 'lemon'
>>> "The items in the basket are %s and %s." % (x,y)
'The items in the basket are apple and lemon.'
|
其中的x、y值为变量,可以根据需要任意修改,但要注意的是,x、y的数据类型要跟字符串中的%类型相对应。例如,在本例中,x、y是字符串类型的数据, 字符串中就为%s。因此,在Python2.6版本之后,新增了format函数来代替%进行格式化字符串。
1 2 3 4 5 6 7 8 | >>> x = 'apple'
>>> y = 'lemon'
>>> "The items in the basket are {0} and {0}.".format(x , y)
'The items in the basket are apple and lemon.'
>>> "The items in the basket are {1} and {0}.".format(x , y)
'The items in the basket are lemon and apple.'
"The items in the basket are {0} and {0}.".format(x , y)
'The items in the basket are apple and apple.'
|
与%相比,format函数具有以下优点:
- 无需关心输入参数的数据类型。
- 输出多个参数的顺序可以随意调节。
- 可重复输出同一参数。
除了format函数外,Python还内置有非常多的处理字符串的函数,例如,find,返回字符串中的某个单词或字符位于字符串的位置;replace, 返回被替代后的字符串等等。在此,不对这些函数做过多的介绍。
4.1.7 变量¶
变量,是除了整数、浮点数、字符串等数据类型外,需要理解的又一个数据概念。我们能在程序的各个位置看到变量的存在,无论是输入、输出,还是中间的过程量。 变量在被使用之前,需要被赋值,可以将整数、浮点数、字符串等数据类型赋给变量。在Python中,赋值的操作并不复杂, 且无需像C语言中一样事先声明变量的数据类型。
1 2 3 4 5 6 7 | >>> x = 1
>>> x
1
>>> x = "Hello"
>>> x
'Hello'
|
而没有事先赋值的变量,会引起Python报错。
1 2 3 4 | >>> y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
|
在定义变量时,需注意变量的命名规则,变量只能由字母、数字和下划线组成,且不能以数字开头。
在Python中还支持链式赋值和同时为多个变量进行赋值:
1 2 3 4 5 6 7 | >>> a = b = c = 1
>>> print(a , b , c)
1 1 1
>>> x , y , z = 1 , 2 , 3
>>> print(x , y , z)
1 2 3
|
甚至还可以不通过中间项直接进行数值交换:
1 2 3 4 5 | >>> x = 1
>>> y = 2
>>> x , y = y , x
>>> print(x , y)
2 1
|
从变量的灵活定义和使用中,可以看出Python是一门易读、简洁的编程语言。
4.1.8 身份运算符¶
身份运算符“is”的返回值为布尔类型,在某些使用场合下,它的用法与比较运算符“==”相同,但二者之间存在本质上的区别。请看下例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> x = y = (1,2)
>>> z = (1,2)
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
>>> x is not z
True
|
可以看出,“is”运算符判断的是两项是否为同一个对象,而“==”则以两项的数据是否相等为判断依据。
4.1.9 成员运算符¶
“in”是成员运算符,通常用于判断数据是否位于序列(字符串、元组、列表)之中,返回值为布尔类型。
1 2 3 4 5 6 7 8 9 10 | >>> x = 1
>>> x in [1,2,3,4]
True
>>> x in [2,3]
False
>>> x not in [2,3]
True
|
以上示例是以列表为例,判断成员x的值(1)是否在列表内。
4.1.10 小结¶
本节从定义和使用这两方面出发,对Python中存在的各种数值类型和运算符进行介绍。
数值类型方面介绍了布尔类型数据在判断语句中的使用、整数和长整数在Python2.x和Python3.x之间的区别、 字符串的定义及处理和变量的命名定义。
在运算符方面,我们知道了在Python中常用的有算数运算符、比较运算符、逻辑运算符、身份运算符和成员运算符,通过这几种运算符, 配合各种数值类型的数据,可以实现数字的计算、数值的比较和逻辑的真假判断。
在介绍完基本的数值类型、运算符和变量的定义后,后面4个小节将介绍Python的数据结构,数据结构可以统称为容器。 序列(如列表、元组和字符串)、映射(如字典)以及集合(set)是三类主要的容器,只有掌握了数据结构,才能对程序的结构进行优化。